<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<root version="5">
	<item content="多个逻辑线程？" icon="question" branch="close" block="narrow" level="0" IsShown="true" IsBold="false" ShowBranch="false">
		<item content="1。 网络数据包的处理顺序问题" icon="none" branch="open" block="narrow" level="1" IsShown="false" IsBold="false" ShowBranch="false">
			<item content="对这个有一个想法，就是每个处理线程对应一个队列，通过某种算法确保同一个玩家的数据包放到同一个队列中，这样就可以确保顺序了" icon="none" branch="open" block="narrow" level="2" IsShown="false" IsBold="false" ShowBranch="false">
				<item content="不过这可能会出现这种情况，某个线程忙得要死，某个线程又闲得要死当然可以考虑对玩家分配进行动态调整，不过这样就复杂一点了--&gt;还是回到最初的问题，就是如何确保在调整玩家分配队列的时候，如何确保其先处理原队列中的数据包" icon="none" branch="none" block="narrow" level="3" IsShown="false" IsBold="false" ShowBranch="false"/>
			</item>
		</item>
		<item content="2。 数据的正确性问题" icon="none" branch="none" block="narrow" level="1" IsShown="false" IsBold="false" ShowBranch="false"/>
		<item content="为了确保读写数据的准确，我们一般都会读写有多个线程共同访问的数据时候进行加锁操作（当然不是那种重量级的锁，而是类似关键段这样的轻量级的锁），这个时候就有一个问题了，一般一个玩家的数据类很多，那么锁的粒度该如何划分呢？1）一种数据一个锁，那锁的数量是不是太多了。。假设一个服务器1K用户，而每个用户又有10个锁，那么整个系统就至少有1W个锁，这就太夸张了吧2）如果是整个用户一个锁的话，那又太粗了，对于效率而言可能会适得其反，因为可能很多时候可以并行的地方还是给串行了，还带来了锁的开销" icon="none" branch="none" block="narrow" level="1" IsShown="false" IsBold="false" ShowBranch="false"/>
		<item content="突然想到，上面这两个问题的解决方法会不会就是一样的呢~。一般来说，跨线程操作涉及到玩家之间的交互，而一般来说只有地理位置在一块的用户才能进行交互。所以，如果在1）问题中，将同一位置的用户分到同一个线程中，那么用户的数据就不用加锁了，只需对几个全局的管理mgr进行加锁就行了，因此锁的问题就不存在了不过这里也有一个问题需要处理，那就用户移动的问题，其实就回到了第一个问题的后面一部分了。还有就是这个同一位置该怎么分呢？同一张地图，还是地图内的某个区域，如果是后者的话还得处理区域边界上的玩家的交互问题，这个可能是跨线程的！" icon="star" branch="none" block="narrow" level="1" IsShown="false" IsBold="false" ShowBranch="false"/>
	</item>
	<item content="多进程？" icon="question" branch="close" block="narrow" level="0" IsShown="true" IsBold="false" ShowBranch="false">
		<item content="交互问题，或者说数据共享问题共享内存？不可避免的带来加锁的问题，如果是那些将频繁使用的数据的话。。。如果使用其他非共享内存的方式又不可避免得带来数据的拷贝" icon="none" branch="none" block="shrink" level="1" IsShown="false" IsBold="false" ShowBranch="false"/>
		<item content="感觉不管是多线程还是多进程，都应该尽可能的想办法减少x程之间的交互" icon="none" branch="none" block="narrow" level="1" IsShown="false" IsBold="false" ShowBranch="false"/>
		<item content="队列应该怎么设计？还是锁的问题，可以不用那种重量级的锁吗？" icon="none" branch="none" block="narrow" level="1" IsShown="false" IsBold="false" ShowBranch="false"/>
	</item>
	<item content="需求分析" icon="none" branch="close" block="narrow" level="0" IsShown="true" IsBold="false" ShowBranch="false">
		<item content="游戏中的实体玩家、幻兽、任务npc、怪兽npc、游戏npc、名人堂里的名人镜像、物品(仓储、掉落在地上的物品参数要多点)、地图" icon="none" branch="none" block="narrow" level="1" IsShown="false" IsBold="false" ShowBranch="false"/>
		<item content="社交，玩家之间的交互好友、组队、军团、家族可能好友模块中会涉及到查询好友的信息，比如所在地图及装备等信息-&gt; 刚看了下，在魔域中没有这类操作，它查看用户装备的时候需要用户在附近才能操作，或者查看名人堂里面那些雕像的装备，但那些装备仅仅是一个备份，不会太频繁的修改(可是可能会很频繁的看呀，要使有读写锁就好了。不过这样也还是有一个问题，是对整个容器加锁还是对单个元素加锁。。单个元素的话还是恐怖了些，其实对一个容器的操作应该也不会太久，关键还有一个是线程数也不多。对容器加锁的意思是包括在使用容器中元素的时候也得加锁，否则加锁就没有什么意义了)个人pk、军团战、" icon="none" branch="none" block="narrow" level="1" IsShown="false" IsBold="false" ShowBranch="false"/>
	</item>
	<item content="仅对玩家，全局统一一个管理容器，然后线程中再单独管理它所管辖的玩家(也做一个容器，在涉及到跨线程的时候一般不需要操作对方的数据，而仅仅是查看对方是否在线)事实上，仔细想想，好像不在同一张地图上的两个玩家不需要涉及到数据的交互不过好像远程摊位可能要，不过既然是远程摊位的话，则可以统一管理，里面加个锁、关键段啥的影响应该不会很大，首先毕竟对其的操作不会像操作user类那样频繁" icon="none" branch="none" block="shrink" level="0" IsShown="true" IsBold="false" ShowBranch="false"/>
	<item content="地图的管理" icon="none" branch="none" block="shrink" level="0" IsShown="true" IsBold="false" ShowBranch="false"/>
	<item content="可以做优化的几个地方" icon="flag" branch="close" block="narrow" level="0" IsShown="true" IsBold="false" ShowBranch="false">
		<item content="1。 逻辑部分用多线程，需要注意的几个地方看前面" icon="none" branch="none" block="narrow" level="1" IsShown="false" IsBold="false" ShowBranch="false"/>
		<item content="2。 定时事件部分，记录每个模块中最近的定时事件，而不是每执行完一条消息就去轮询一下所有的定时事件" icon="none" branch="none" block="narrow" level="1" IsShown="false" IsBold="false" ShowBranch="false"/>
		<item content="3。 数据部分用不用共享内存呢，防止程序崩溃时数据丢失，不过如果这样的话，那现有框架中的大部分数据库中的数据保存形式都得改了，不应该去直接使用底层的那些结构" icon="none" branch="none" block="narrow" level="1" IsShown="false" IsBold="false" ShowBranch="false"/>
	</item>
	<item content="魔法技能" icon="none" branch="close" block="narrow" level="0" IsShown="true" IsBold="false" ShowBranch="false">
		<item content="目标：	个体还是群体 ---&gt; 计算相应目标 （一群，是否是有方向，还是以其为圆心）" icon="none" branch="none" block="narrow" level="1" IsShown="false" IsBold="false" ShowBranch="false"/>
		<item content="效果" icon="none" branch="open" block="narrow" level="1" IsShown="false" IsBold="false" ShowBranch="false">
			<item content="1。 伤害效果　--&gt; 魔法伤害还是物理伤害，同时计算其伤害值，，，有些玩家可能会有魔免效果" icon="none" branch="none" block="narrow" level="2" IsShown="false" IsBold="false" ShowBranch="false"/>
			<item content="2。 改变状态效果" icon="none" branch="none" block="narrow" level="2" IsShown="false" IsBold="false" ShowBranch="false"/>
			<item content="3。 移动效果" icon="none" branch="none" block="narrow" level="2" IsShown="false" IsBold="false" ShowBranch="false"/>
			<item content="4。 召唤小怪" icon="none" branch="none" block="narrow" level="2" IsShown="false" IsBold="false" ShowBranch="false"/>
			<item content="5。 分身" icon="none" branch="none" block="narrow" level="2" IsShown="false" IsBold="false" ShowBranch="false"/>
			<item content="6。 传送" icon="none" branch="none" block="narrow" level="2" IsShown="false" IsBold="false" ShowBranch="false"/>
			<item content="7。 复制" icon="none" branch="none" block="narrow" level="2" IsShown="false" IsBold="false" ShowBranch="false"/>
			<item content="8。 震飞目标" icon="none" branch="none" block="narrow" level="2" IsShown="false" IsBold="false" ShowBranch="false"/>
		</item>
		<item content="释放过程   -&gt;　状态模式，但为了这么三个状态就使用一个模式，太小题大做了吧" icon="none" branch="open" block="narrow" level="1" IsShown="false" IsBold="false" ShowBranch="false">
			<item content="1。 吟唱，准备阶段，其他动作将打断魔法的释放在这个过程中计算目标" icon="none" branch="none" block="narrow" level="2" IsShown="false" IsBold="false" ShowBranch="false"/>
			<item content="2。 魔法动作阶段，需要玩家的参与         可能某个魔法是一个持续的过程，这个时候得重新计算目标了，这样的话进行定时事件，每隔一段时间计算一次魔法伤害在这个过程中，玩家不能进行其他动作  -- 有些应该可以执行其他动作，比如飞行？ ----&gt; 飞行还是做成状态吧本过程计算及应用效果，比如伤害或其他效果" icon="none" branch="none" block="narrow" level="2" IsShown="false" IsBold="false" ShowBranch="false"/>
			<item content="3。 cd时间，这个时间可以释放其他技能，但不能使用本技能" icon="none" branch="none" block="narrow" level="2" IsShown="false" IsBold="false" ShowBranch="false"/>
		</item>
		<item content="条件检查---&gt;如果用户释放魔法将打破隐身状态" icon="none" branch="none" block="narrow" level="1" IsShown="false" IsBold="false" ShowBranch="false"/>
		<item content="技能类型表技能分类，主/被动技能，目标数量，效果范围(相关的参数)，效果类型1、num1，效果类型2、num2，准备时间，效果时间，效果间隔(每隔这个时间计算一次)，cd时间，等级需求，物品需求，职业需求，xp技能，其他参数。。。应该再加个是否可打断标志" icon="star" branch="none" block="narrow" level="1" IsShown="false" IsBold="false" ShowBranch="false"/>
		<item content="" icon="none" branch="none" block="narrow" level="1" IsShown="false" IsBold="false" ShowBranch="false"/>
	</item>
	<item content="测试多线程下，锁粒度的影响，可能的影响因素有下面几个" icon="flag" branch="open" block="narrow" level="0" IsShown="true" IsBold="false" ShowBranch="false">
		<item content="用户的数量、线程数量、每次加锁内的执行时间" icon="none" branch="none" block="narrow" level="1" IsShown="true" IsBold="false" ShowBranch="false"/>
	</item>
	<item content="测试共享内存" icon="flag" branch="close" block="narrow" level="0" IsShown="true" IsBold="false" ShowBranch="false">
		<item content="1。 实际使用的时候应该对该共享内存进行分块，呵呵，也可以在每块前面加上bitmap不过这样是否会造成不管多少玩家在线，都预分配了这么多的实际内存呢？   ----&gt; 需要测试！--》不管是使用reserve方式还是commit方式，都不会一次性分配那么多内存，都是逐步分配的，当然reserve方式的话是由程序员手动分配，而后者则是系统自动分配" icon="none" branch="none" block="narrow" level="1" IsShown="false" IsBold="false" ShowBranch="false"/>
		<item content="2。 看看能否找到使用指针的情况，可能需要设置基地址如果可以的话将会方便很多了，如果不能，则可能需要使用索引的方式---- mapviewoffileex可以指定基地址可以使用指针，通过mapviewoffileex可以 指定基地址，不过如果需要的空间太大的话，则调用该函数可能失败，因为可能指定的基地址无法满足那么多的内存地址范围需要不过现在想想，好像也确实想不到需要使用到指针的情况，因为目前所考虑的使用场景还仅仅是对应着数据库中的数据--&gt;仅保存数据库中的数据的话，应该无法做到逻辑服务器崩溃而不影响客户端，因为很多非数据库数据则意味着状态 --&gt; 但是这些状态又有什么呢，暂时丢掉这些状态也可以接受吧" icon="none" branch="none" block="narrow" level="1" IsShown="false" IsBold="false" ShowBranch="false"/>
		<item content="作对应的时候，还有一个问题需要注意，那就是如果是删除一条记录的时候，比如删除了背包中的一个物品，那么这个时候就需要delete到数据库中去，或者有什么更好的方法吗？再设置一个脏标记会好点在free的时候同时发送一条sql语句过去？" icon="none" branch="none" block="narrow" level="1" IsShown="false" IsBold="false" ShowBranch="false"/>
	</item>
	<item content="动" icon="none" branch="close" block="narrow" level="0" IsShown="true" IsBold="false" ShowBranch="false">
		<item content="" icon="none" branch="none" block="wide" level="1" IsShown="false" IsBold="false" ShowBranch="false"/>
	</item>
	<item content="14:39:20 (马良):请问一下有谁知道unknown 013A0F85:0) (USER32.dll 00008816:1) (0000C63F:2) (0000C665:3) (MFC42u.DLL 00002189:4) (00001BDC:5) (00001B36:6) (00001A8E:7) (0008CD62:8) (USER32.dll 00008734:9) (00008816:10) (0000B89B:11) (0000B903:12) (00015C14:13) (00015C6A:14) (00013E3A:15) (000137BC:16)程序的异常堆栈是这样，出现PRIVILEGED INSTRUCTION异常的原因么？14:40:47 (李上杰):特权指令...执行了类型 int 3  sysenter 这样的指令访问内核的14:42:05 (张伟强):可能情况1）嵌入汇编，调用了特权指令2）堆栈破环了，跳转到未知位置，执行未知代码，被解释成特权指令" icon="none" branch="close" block="narrow" level="0" IsShown="true" IsBold="false" ShowBranch="false">
		<item content="【程序中心】技术交流- 多人聊天" icon="none" branch="none" block="wide" level="1" IsShown="false" IsBold="false" ShowBranch="false"/>
	</item>
	<item content="" icon="none" branch="none" block="narrow" level="0" IsShown="true" IsBold="false" ShowBranch="false"/>
	<item content="人物或怪等的移动速度、攻击速度等这些是怎么控制的呢？ --&gt; 玩家是可以跑的(参数为走的+20大概)，但是如果挂了后的灵魂状态下则不可以跑，所以显得很慢，这个主要是在客户端上体现出来的" icon="none" branch="none" block="narrow" level="0" IsShown="true" IsBold="false" ShowBranch="false"/>
	<item content="};" icon="none" branch="close" block="narrow" level="0" IsShown="true" IsBold="false" ShowBranch="false">
		<item content="TestMagic - Microsoft Visual Studio" icon="none" branch="none" block="wide" level="1" IsShown="false" IsBold="false" ShowBranch="false"/>
	</item>
	<item content="周六要一起看球滴同学看过来哇看过来····星期六晚：20：00···福新路帝苑哈··包厢号要等明天晚上到那后才知道···大家把我滴手机号记下来撒~13599097741别到了找不到组织就惨" icon="none" branch="close" block="narrow" level="0" IsShown="true" IsBold="false" ShowBranch="false">
		<item content="樊璐- 聊天" icon="none" branch="none" block="wide" level="1" IsShown="false" IsBold="false" ShowBranch="false"/>
	</item>
	<item content="" icon="none" branch="close" block="narrow" level="0" IsShown="true" IsBold="false" ShowBranch="false">
		<item content="TestMagic - Microsoft Visual Studio" icon="none" branch="none" block="wide" level="1" IsShown="false" IsBold="false" ShowBranch="false"/>
	</item>
	<item content="此内存泄漏比较隐蔽，程序中动态申请的内存都已经被正常地被释放了，但是仍存在一大堆内存泄漏信息。跟踪此问题时，无意中察觉到一个struct结构体变量含有大量的stl成员变量；众所周知，stl变量内部都自己维护着一个内存队列，这个内存的申请和释放对调用者来说是完全透明的。这个含有stl成员变量的结构体变量，被放在一个for循环内部，在每次循环开始前，都通过memset清除该结构体的数据，就是由于这个操作，使stl成员变量的内存索引指针数据被清零，从而使stl内部无法正常内存释放数据，这样就造成了大量的内存泄漏。" icon="none" branch="close" block="narrow" level="0" IsShown="true" IsBold="false" ShowBranch="false">
		<item content="隐蔽的内存泄漏-案例库- 程序中心知识库-让程序员智慧地工作！ - 让程序员智慧地工作! - Windows Internet Explorerhttp://www.pc.nd/index.php?doc-view-4716" icon="none" branch="none" block="wide" level="1" IsShown="false" IsBold="false" ShowBranch="false"/>
	</item>
	<item content="状态，定时器" icon="none" branch="none" block="narrow" level="0" IsShown="true" IsBold="false" ShowBranch="false"/>
</root>
